package com.dhnsoft.代码随想录.链表;

/**
 * ClassName: d06_203_移除链表元素
 * Package: com.dhnsoft.代码随想录
 * Description:
 *
 * @Author dhn
 * @Create 2024/3/7 10:20
 * @Version 1.0
 */
public class d01_203_移除链表元素 {
    public static void main(String[] args) {
        LinkedNode singLinked = new LinkedNode();
        ListNode l1 = new ListNode(7);
        ListNode l2 = new ListNode(7);
        ListNode l3 = new ListNode(7);
        ListNode l4 = new ListNode(7);
//        ListNode l5 = new ListNode(4);
//        ListNode l6 = new ListNode(5);
//        ListNode l7 = new ListNode(6);
        singLinked.add(l1);
        singLinked.add(l2);
        singLinked.add(l3);
        singLinked.add(l4);
//        singLinked.add(l5);
//        singLinked.add(l6);
//        singLinked.add(l7);
        singLinked.list();

        ListNode listNode = removeElements(singLinked.getHead(), 7);
        System.out.println("移出元素后---");
        singLinked.list();
    }

    public static ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return head;
        }
        ListNode t1 = head;
        ListNode t2 = head.next;
        while (t2!=null){
            if(t2.val!=val){
                t1 = t2;
                t2 = t2.next;
            }
            else {
                t1.next = t2.next;
                t2 = t2.next;
            }
        }
        return head;
    }

    //使用原来链表来移出元素
    public static ListNode removeElements2(ListNode head,int val){
        //第一种情况是头指针有有指定元素的情况
        //一直将与目标值相同的节点向后移
        while (head.next!=null&&head.next.val==val){
            head = head.next;
        }
        // 已经为null，提前退出
        if (head == null) {
            return head;
        }
        //接下来处理后续不是头节点的指针了
        //初始化一个当前节点指针来动态查找目标值
        ListNode preNode = head;
        ListNode curNode = head.next;
        while(curNode!=null){
            if(curNode.val==val){
                preNode.next = curNode.next;
            }
            else{
                preNode = curNode;
            }
            curNode = curNode.next;
        }
        return head;

    }
}
